/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.anuncio;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.BLDDataErro;
import br.com.bld.util.facade.EntityFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

/**
 *
 * @author Pedro
 */
public class AnuncioBe extends AbstractBe implements BLDDataErro {

    private final AnuncioDao dao;

    public AnuncioBe() throws SQLException {
        super();

        dao = createDao();
    }

    public AnuncioBe(Connection conn) throws SQLException {
        super(conn);

        dao = createDao();
    }

    private AnuncioDao createDao() {

        String table = "bldtb09_anuncio";

        String[] fields = {
            "id",
            "bldtb01_id",
            "data_inicio",
            "data_fim",
            "imagem_name",
            "imagem bytea",
            "bldtb08_id"
        };

        String[] pk = {"id", "bldtb01_id"};

        String sequece = "bldtb09_anuncio_id_seq";

        return new AnuncioDao(conn, new EntityFactory(conn, table, fields, pk, sequece));
    }

    public int inserir(AnuncioEntity entity, Long clienteId) throws SQLException, FileNotFoundException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AnuncioEntity.CLASS_ID));
        }

        int resposta = dao.insert(entity, new AnuncioPK(proximoId(), clienteId));

        commit();

        return resposta;
    }

    public AnuncioEntity selecionar(AnuncioPK pk) throws SQLException, IOException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AnuncioPK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(AnuncioEntity entity, AnuncioPK pk) throws SQLException, IOException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AnuncioEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(AnuncioPK pk) throws SQLException, IOException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AnuncioPK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<AnuncioPK, AnuncioEntity> selecionarTodos() throws SQLException, IOException {
        return dao.selectAll();
    }

    public HashMap<AnuncioPK, AnuncioEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException, IOException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }

    private Long proximoId() throws SQLException {
        return dao.nextSequeceValue();
    }
}
